/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package uy.edu.ort.uruguayviajes.negocio.servicios.impl;

import javax.ejb.EJB;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.ejb.Stateless;
import javax.faces.convert.ConverterException;
import javax.xml.datatype.XMLGregorianCalendar;
import uy.edu.or.uruguayviajes.negocio.servicios.ReservaService;
import uy.edu.ort.comun.dominio.dto.*;
import uy.edu.ort.uruguayviajes.negocio.excepciones.ReservaException;
import uy.edu.or.uruguayviajes.negocio.ws.credito.AutorizacionCredito;
import uy.edu.or.uruguayviajes.negocio.ws.credito.AutorizacionCreditoService;
import uy.edu.or.uruguayviajes.negocio.ws.credito.ResultadoAutorizacion;
import uy.edu.or.uruguayviajes.negocio.ws.credito.DatosTarjeta;
import uy.edu.or.uruguayviajes.negocio.ws.paquete.ConsultaPaquetesTuristicos;
import uy.edu.or.uruguayviajes.negocio.ws.paquete.ConsultaPaquetesTuristicosService;
import uy.edu.or.uruguayviajes.negocio.ws.paquete.PaqueteTuristico;
import uy.edu.ort.uruguayviajes.dao.servicios.DaoServices;

/**
 *
 * @author dberriel
 */
@Stateless
public class ReservaServiceBean implements ReservaService {

    @EJB
    private DaoServices daoServiceBean;
    // Add business logic below. (Right-click in editor and choose
    // "Insert Code > Add Business Method")

    public java.util.List<PaqueteDTO> consultarPaquetes() throws ReservaException {
        try {
            ConsultaPaquetesTuristicosService service = new ConsultaPaquetesTuristicosService();
            ConsultaPaquetesTuristicos port = service.getConsultaPaquetesTuristicosPort();
            List<PaqueteTuristico> paquetes = port.consultarPaquetes();
            System.out.println("cantidad de paquetes: " + paquetes.size());
            return paquetesToDto(paquetes);
        } catch (ReservaException rU) {
            throw rU;
        } catch (Exception ex) {
            throw new ReservaException("No se ha podido establecer la consulta de paquetes.");
        }
    }

    private List<PaqueteDTO> paquetesToDto(List<PaqueteTuristico> paquetes) throws ReservaException {
        Iterator it = paquetes.iterator();
        List<PaqueteDTO> paquetesDTO = new ArrayList<PaqueteDTO>();
        try {
            while (it.hasNext()) {
                PaqueteTuristico p = (PaqueteTuristico) it.next();
                PaqueteDTO paqDto = new PaqueteDTO();
                paqDto.setCodigo(p.getCodigo());
                paqDto.setCosto(p.getCosto());
                paqDto.setDescripcion(p.getDescripcion());
                paqDto.setDestino(p.getDestino());
                XMLGregorianCalendar xcalLlegada = p.getFechaLlegada();
                java.util.Date dtLlegada = xcalLlegada.toGregorianCalendar().getTime();
                paqDto.setFechaLlegada(dtLlegada);
                XMLGregorianCalendar xcalSalida = p.getFechaSalida();
                java.util.Date dtSalida = xcalLlegada.toGregorianCalendar().getTime();
                paqDto.setFechaSalida(dtSalida);
                paqDto.setMoneda(p.getMoneda());
                paqDto.setOrigen(p.getOrigen());
                paqDto.setServicios(p.getServicios());
                paquetesDTO.add(paqDto);
            }
            return paquetesDTO;
        } catch (Exception ex) {
            throw new ReservaException("Error al convertir datos de los paquetes.");
        }
    }

    private DatosTarjeta convertirADatosTarjeta(DatosTarjetaDTO dDTO) throws ReservaException{
        try {
            DatosTarjeta datos = new DatosTarjeta();
            datos.setCodigoSeguridad(dDTO.getCodigoSeguridad());
            datos.setNombreTitular(dDTO.getNombreTitular());
            datos.setNumero(dDTO.getNumero());
            datos.setTipo(dDTO.getTipo());
            datos.setVencimiento(dDTO.getVencimiento());
            return datos;
        }catch(ConverterException cE){
            throw new ReservaException("Error al convertir datos de la tarjeta de crédito.");
        }
    }

    public void reservar(DatosTarjetaDTO datosDTO, UsuarioDTO usuario, PaqueteDTO paquete, String moneda, double monto) throws ReservaException {
        try {
            AutorizacionCreditoService service = new AutorizacionCreditoService();
            AutorizacionCredito port = service.getAutorizacionCreditoPort();
            DatosTarjeta datos = convertirADatosTarjeta(datosDTO);
            ResultadoAutorizacion resultado = port.autorizar(datos, moneda, monto);
            if (!resultado.isError()) {
                ingresarReserva(usuario, paquete, resultado.getCodigoAutorizacion(), datos.getNumero());
                daoServiceBean.ingresarReserva(usuario, paquete, moneda, moneda);
            } else {
                throw new ReservaException("No se ha autorizado el pago.");
            }
        } catch (Exception ex) {
            throw new ReservaException("No se logró realizar la reserva.");
        }
    }

    public void ingresarReserva(UsuarioDTO usuario, PaqueteDTO paquete, String codigoAutorizacion, String tarjeta) throws ReservaException {
        try {
            daoServiceBean.ingresarReserva(usuario, paquete, codigoAutorizacion, tarjeta);
        } catch (Exception ex) {
            throw new ReservaException("No se logró realizar la reserva.");
        }
    }
    
    public void actualizarReserva(String codigoAutorizacion, String estado)throws ReservaException {
        try{
            daoServiceBean.actualizarReserva(codigoAutorizacion, estado);
        }
        catch (Exception ex) {
            throw new ReservaException("No se logró actualizar la reserva.");
        }
    }
}
